// una funzione generica esegue automaticamente
// l'overloaing di se stessa

// esempio di funzione template
// il tipo di dati su cui la funzione o la classe
// operano è passato come indirizzo



#include <iostream>
using namespace std;

// questa e' una funzione template
// definizione generica

template <class X> void swapargs(X &a, X &b)
{
	X temp;

	temp = a;
	a = b;
	b = temp;
}

int main()
{
// il compilatore crea tre versioni di swapargs

	int i=10, j=20;
	float x=10.1, y=23.3;
	char a='x',b='z';

	cout << "i e j originali:  " << i << ' ' << j << endl;
	cout << "x e y originali:  " << x << ' ' << y << endl;
	cout << "a e b originali:  " << a << ' ' << b << "\n\n\n\n";

	swapargs(i, j); // scambia due interi
	swapargs(x, y); // scambia due float
	swapargs(a, b); // scambia due char

	cout << "i e j scambiati:  " << i << ' ' << j << endl;
	cout << "x e y scambiati:  " << x << ' ' << y << endl;
	cout << "a e b scambiati:  " << a << ' ' << b << "\n\n";

	return 0;
}